gusucode.com > 支持向量机工具箱 - LIBSVM OSU_SVM LS_SVM源码程序 > 支持向量机工具箱 - LIBSVM OSU_SVM LS_SVM\stprtool\linear\anderson\minepsvl.m
function [alpha]=minepsvl(MI,SG,alpha,dalpha,tmax,vdelta) % MINEPSVL finds optimal alpha (Generalized Anderson's task). % [alpha]=minepsvl(MI,SG,alpha,dalpha,tmax,vdelta) % % MINEPSRT is an auxiliary function used in algorithms GANDERS % and GANDERS2. For more details refer to book SH10. % % This function maximizes unimodal objective function which % acts in algorithm solving Generalized Anderson's task. % % This method discretizes function value of the objective % function. % % See also MINEPS, MINEPSRT, GANDERS, GANDERS2, book SH10. % % Statistical Pattern Recognition Toolbox, Vojtech Franc, Vaclav Hlavac % (c) Czech Technical University Prague, http://cmp.felk.cvut.cz % Written Vojtech Franc (diploma thesis) 11.5.2000 % Modifications % 24. 6.00 V. Hlavac, comments polished. % default setting if nargin < 5, tmax = inf; delta=1e-6; elseif nargin < 6, delta=0; end % get dimension N and the # of distribution K = size(MI,2); N = size(MI,1); % computes Fdown, Fup minrs=(alpha'*MI)./sqrt( reshape(alpha'*SG,N,K)'*alpha )'; Fdown=min(minrs); Fup=max(minrs); % compute constants for j = 1:K, s(j)= alpha'*MI(:,j); ss(j) = dalpha'*MI(:,j); ds(j) = ss(j) - s(j); sga(j) = alpha'*SG(:,(j-1)*N+1:j*N)*alpha; sgd(j) = dalpha'*SG(:,(j-1)*N+1:j*N)*dalpha; sgad(j) = dalpha'*SG(:,(j-1)*N+1:j*N)*alpha; end [U]=fteps(Fdown,K,s,ss,ds,sga,sgd,sgad); if isempty(U), % alpha can`t be better return; end T=U; while (Fup-Fdown) > vdelta & tmax > 0, tmax=tmax-1; % compute Fmid Fmid=1/2*(Fup+Fdown); % find t from U, min r(alpha*(1-t)+dalpha*t,mi(j),sigma(j)) >= Fmid, for every j [U]=fteps(Fmid,K,s,ss,ds,sga,sgd,sgad); if isempty(U)==1, Fup=Fmid; else T=U; Fdown=Fmid; end end % while ... % computes alpha t=1/2*(T(1)+T(2)); alpha=alpha*(1-t)+dalpha*t; return %%%%%%%%%%%%%%%%%%%%%%%% function [U]=fteps(c,K,s,ss,ds,sga,sgd,sgad) % checks if F(t) >= c, t is from U % Tup=1; c2=c^2; for j=1:K, A(j)=ds(j)^2 - sga(j)*c2 + 2*sgad(j)*c2 - sgd(j)*c2; B(j)=2*s(j)*ds(j) + 2*sga(j)*c2 - 2*sgad(j)*c2; C(j)=s(j)^2 - sga(j)*c2; %%%%%%%%%%% if ds(j) < 0, Tup=min([Tup, -s(j)/ds(j)]); end end U=[0 Tup]; for j=1:K, if A(j) == 0, % linear if B(j) ~= 0, t=-C(j)/B(j); if B(j) < 0, U=setand(U,[-inf t]); U=[]; else U=setand(U,[t inf]); end elseif C(j) < 0, U=[]; end else % quadratic D=B(j)^2 - 4*A(j)*C(j); if D < 0, if A(j) < 0, U=[]; end elseif D == 0, t=-B(j)/(2*A(j)); U=setand(U,[t t]); else % D > 0 t1=(-B(j)-sqrt(D))/(2*A(j)); t2=(-B(j)+sqrt(D))/(2*A(j)); if t1 > t2, [t1,t2]=swap(t1,t2); end if A(j) < 0, U=setand(U,[t1 t2]); else U=setand(U,[-inf,t1,t2,inf]); end end % if , else end if isempty(U), return; end end return function [T]=setand(T1,T2) % % T=[]; for i=1:size(T1,2)/2, for j=1:size(T2,2)/2, U=and2([T1((i-1)*2+1),T1(i*2)],[T2((j-1)*2+1),T2(j*2)]); if ~isempty(U), T=[T,U]; end end end return %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function [T]=and2(T1,T2) % T= T1 U T2 % T1 = sort(T1); T2 = sort(T2); if T1(1) > T2(1), [T1,T2]=swap(T1,T2); end if T1(2) < T2(1), T=[]; elseif T2(2) < T1(2), T=T2; else T=[T2(1) T1(2)]; end return function [A,B]=swap(A,B) % ASWAP=A; A=B; B=ASWAP; return